home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-ARM / PROC-ARM.{21 / SYSTEM.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  3KB  |  137 lines

  1. /*
  2.  * linux/include/asm-arm/proc-armv/system.h
  3.  *
  4.  * Copyright (C) 1996 Russell King
  5.  */
  6.  
  7. #ifndef __ASM_PROC_SYSTEM_H
  8. #define __ASM_PROC_SYSTEM_H
  9.  
  10. extern const char xchg_str[];
  11.  
  12. extern __inline__ unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
  13. {
  14.     switch (size) {
  15.         case 1:    __asm__ __volatile__ ("swpb %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory");
  16.             break;
  17.         case 2:    abort ();
  18.         case 4:    __asm__ __volatile__ ("swp %0, %1, [%2]" : "=r" (x) : "r" (x), "r" (ptr) : "memory");
  19.             break;
  20.         default: arm_invalidptr(xchg_str, size);
  21.     }
  22.     return x;
  23. }
  24.  
  25. #define set_cr(x)                    \
  26.     do {                        \
  27.     __asm__ __volatile__(                \
  28.     "mcr    p15, 0, %0, c1, c0    @ set CR"    \
  29.       : : "r" (x));                    \
  30.     } while (0)
  31.  
  32. extern unsigned long cr_no_alignment;    /* defined in entry-armv.S */
  33. extern unsigned long cr_alignment;    /* defined in entry-armv.S */
  34.  
  35. /*
  36.  * We can wait for an interrupt...
  37.  */
  38. #define proc_idle()                        \
  39.     do {                            \
  40.     __asm__ __volatile__(                    \
  41. "    mcr    p15, 0, %0, c15, c8, 2    @ proc_idle"        \
  42.       : : "r" (0));                        \
  43.     } while (0)
  44.  
  45. /*
  46.  * A couple of speedups for the ARM
  47.  */
  48.  
  49. /*
  50.  * Save the current interrupt enable state & disable IRQs
  51.  */
  52. #define __save_flags_cli(x)                    \
  53.     do {                            \
  54.       unsigned long temp;                    \
  55.       __asm__ __volatile__(                    \
  56.     "mrs    %1, cpsr        @ save_flags_cli\n"    \
  57. "    and    %0, %1, #192\n"                    \
  58. "    orr    %1, %1, #128\n"                    \
  59. "    msr    cpsr, %1"                    \
  60.       : "=r" (x), "=r" (temp)                \
  61.       :                            \
  62.       : "memory");                        \
  63.     } while (0)
  64.     
  65. /*
  66.  * Enable IRQs
  67.  */
  68. #define __sti()                            \
  69.     do {                            \
  70.       unsigned long temp;                    \
  71.       __asm__ __volatile__(                    \
  72.     "mrs    %0, cpsr        @ sti\n"        \
  73. "    bic    %0, %0, #128\n"                    \
  74. "    msr    cpsr, %0"                    \
  75.       : "=r" (temp)                        \
  76.       :                            \
  77.       : "memory");                        \
  78.     } while(0)
  79.  
  80. /*
  81.  * Disable IRQs
  82.  */
  83. #define __cli()                            \
  84.     do {                            \
  85.       unsigned long temp;                    \
  86.       __asm__ __volatile__(                    \
  87.     "mrs    %0, cpsr        @ cli\n"        \
  88. "    orr    %0, %0, #128\n"                    \
  89. "    msr    cpsr, %0"                    \
  90.       : "=r" (temp)                        \
  91.       :                            \
  92.       : "memory");                        \
  93.     } while(0)
  94.  
  95. /*
  96.  * save current IRQ & FIQ state
  97.  */
  98. #define __save_flags(x)                        \
  99.     do {                            \
  100.       __asm__ __volatile__(                    \
  101.     "mrs    %0, cpsr        @ save_flags\n"        \
  102. "    and    %0, %0, #192"                    \
  103.       : "=r" (x)                        \
  104.       :                            \
  105.       : "memory");                        \
  106.     } while (0)
  107.  
  108. /*
  109.  * restore saved IRQ & FIQ state
  110.  */
  111. #define __restore_flags(x)                    \
  112.     do {                            \
  113.       unsigned long temp;                    \
  114.       __asm__ __volatile__(                    \
  115.     "mrs    %0, cpsr        @ restore_flags\n"    \
  116. "    bic    %0, %0, #192\n"                    \
  117. "    orr    %0, %0, %1\n"                    \
  118. "    msr    cpsr, %0"                    \
  119.       : "=r" (temp)                        \
  120.       : "r" (x)                        \
  121.       : "memory");            \
  122.     } while (0)
  123.  
  124. #ifdef __SMP__
  125. #error SMP not supported
  126. #else
  127.  
  128. #define cli() __cli()
  129. #define sti() __sti()
  130. #define save_flags(x)        __save_flags(x)
  131. #define restore_flags(x)    __restore_flags(x)
  132. #define save_flags_cli(x)    __save_flags_cli(x)
  133.  
  134. #endif
  135.  
  136. #endif
  137.